#!/usr/bin/env python
# coding: utf-8

# In[1]:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#读取excel数据
data=pd.read_excel(r'C:\Users\Sunny\Desktop\data.xlsx')
#数据预处理
df=pd.DataFrame(data)
#负数转为正数
df['实付金额']=df['实付金额'].abs()


# In[2]:


#用户数量初统计
  #总用户数量
user=df.drop_duplicates('用户ID')
usercount=user.value_counts('用户ID').count()

#商家数量初统计（同上）
shop=df.drop_duplicates('商家ID')
shopcount=shop.value_counts('商家ID').count()

#金额初统计
  #总实付金额
money=df['实付金额'].sum()
  #总邮费
post_money=df['邮费'].sum()
  #已使用优惠券的订单数量
discount_order=df[df['使用状态'].isin([1])]
discount_ordercount=len(discount_order)
  #未使用优惠券的订单数量
discount_no_order=df[(df['使用状态'].isin([0]))|(df['使用状态'].isnull())]
discount_no_ordercount=len(discount_no_order)
#未使用的订单细分
discount_no_ordercount1=len(df[(df['使用状态'].isin([0]))])
discount_no_ordercount2=len(df[(df['使用状态'].isnull())])


# In[3]:


#按前十省份统计数据分析
  #用户数量
province_df=user.groupby('省份')#省份分组
province_usercount_mean=province_df.size().mean()#各省份平均用户数量

#前十省份
custom_order=['上海','广东省','北京','江苏省' ,'浙江省','山东省','湖北省','四川省','福建省','辽宁省']
province_usercount=province_df['用户ID'].size().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))#各省份总用户数量
  #优惠券已使用的用户数量
discount_user=user[user['使用状态'].isin([1])]
province_discount_usercount=discount_user.groupby('省份').size().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))
  #优惠券未使用的用户数量
discount_no_user=user[user['使用状态'].isnull()|user['使用状态'].isin([0])]
province_discount_no_usercount=discount_no_user.groupby('省份').size().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))
  #实付金额（同上）
province_df2=df.groupby('省份')#省份分组
province_money_mean=province_df2['实付金额'].sum().mean()
province_money=province_df2['实付金额'].sum().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))
  #优惠券已使用的实付金额
province_discount_money=discount_order.groupby('省份')['实付金额'].sum().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))
  #优惠券未使用的实付金额
province_discount_no_money=discount_no_order.groupby('省份')['实付金额'].sum().sort_index(
    key=lambda x: x.map({name: i for i, name in enumerate(custom_order)}))


# In[4]:


#按时间统计购买数量分析
  #购买数量高峰月
month_money=df.groupby(df['付款日期'].dt.month)['购买数量'].sum()
  #购买数量高峰日
day_money=df.groupby(df['付款日期'].dt.day)['购买数量'].sum()
  #购买数量高峰时刻
hour_money=df.groupby(df['付款日期'].dt.hour)['购买数量'].sum()


# In[5]:


#分组分析
  #根据各用户的实付金额的四分位数分组
display(df.groupby('用户ID')['实付金额'].sum().describe())
def group_user(x):
    if x>0 and x<=74:
        return '低消费'
    elif x>74 and x<=123:
        return '中低消费'
    elif x>123 and x<=189:
        return '中高消费'
    else:
        return '高消费'
  #将消费水平插入dataframe
people_group=df['实付金额'].apply(group_user)
people_group=pd.Series(people_group,name='消费水平')
df['消费水平']=people_group

  #将单价插入dataframe
price=(df["实付金额"]-df['邮费'])/df['购买数量']
price=pd.Series(price,name='单价')
df['商品单价']=price

  #根据各商家的商品单价的平均数四分位数分组
display(df.groupby('商家ID')['商品单价'].mean().describe())
def group_price(x):
    if x>0 and x<=55:
        return '低价商品'
    elif x>55 and x<=94:
        return '中低价商品'
    elif x>94 and x<=138:
        return '中高价商品'
    else:
        return '高价商品'
  #将店铺分类插入dataframe
price_group=df['商品单价'].apply(group_price)
price_group=pd.Series(price_group,name='商品分类')
df['商品分类']=price_group


# In[6]:


#可视化
  #设置中文
plt.rcParams['font.sans-serif']='SimHei'

#各省份用户数量可视化
  #将前10省份和其他21个省份写入一起
ot_pr_us = province_usercount[10:].sum()
province_usercount_df = province_usercount[:10]
province_usercount_df['其他21省'] = ot_pr_us
province_usercount_df['平均'] = int(province_usercount_mean)
  #计算未使用优惠券的用户数量的DataFrame
unused_province_discount_usercount_df = province_discount_no_usercount[:10]
ot_pr_us2 = province_discount_no_usercount[10:].sum()
unused_province_discount_usercount_df['其他21省'] = ot_pr_us2
unused_province_discount_usercount_df['平均'] = int(province_discount_no_usercount.mean())
  #计算已使用优惠券的用户数量的DataFrame
province_discount_usercount_df = province_discount_usercount[:10]
ot_pr_us1 = ot_pr_us-ot_pr_us2
province_discount_usercount_df['其他21省'] = ot_pr_us1
province_discount_usercount_df['平均'] = int(province_discount_usercount.mean())


# In[7]:


#绘制柱形图
plt.figure(figsize=(22, 12))
bar_width = 0.25
index = np.arange(len(province_usercount_df))
#绘制用户数量的柱形图
plt.bar(index, province_usercount_df.values,
      bar_width, label='用户数量')
#已使用优惠券的用户数量的柱形图
plt.bar(index + bar_width, province_discount_usercount_df.values,
      bar_width, label='已使用优惠券的用户数量')
#未使用优惠券的用户数量的柱形图
plt.bar(index + 2 * bar_width, unused_province_discount_usercount_df.values,
      bar_width, label='未使用优惠券的用户数量')
plt.xlabel('省份', fontsize=20)
plt.ylabel('数量', fontsize=20)
plt.title('各省份用户数量及已使用/未使用优惠券的用户数量')
plt.xticks(index + 1.5 * bar_width, province_usercount_df.index)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend()
#在柱形上添加数据更直观
for p, user_u, coupon_u, unused_coupon_u in zip(index, province_usercount_df.values,
                                              province_discount_usercount_df.values,
                                              unused_province_discount_usercount_df.values):
  plt.text(p, user_u, str(user_u), ha='center', va='bottom')
  plt.text(p + bar_width, coupon_u, str(coupon_u), ha='center', va='bottom')
  plt.text(p + 2 * bar_width, unused_coupon_u, str(unused_coupon_u), ha='center', va='bottom')

#实付金额（同上）
#将前10省份和其他21个省份写入一起
province_money_df = province_money[:10]
ot_pr_mn = province_discount_money[10:].sum()
province_money_df['其他21省'] = ot_pr_mn
province_money_df['平均'] = int(province_money_mean)
#计算未使用优惠券的实付金额的DataFrame
unused_province_discount_money_df = province_discount_no_money[:10]
ot_pr_mn2 = province_discount_no_money[10:].sum()
unused_province_discount_money_df['其他21省'] = ot_pr_mn2
unused_province_discount_money_df['平均'] = int(province_discount_no_money.mean())
#计算已使用优惠券的实付金额的DataFrame
province_discount_money_df = province_discount_money[:10]
ot_pr_mn1 = ot_pr_mn-ot_pr_mn2
province_discount_money_df['其他21省'] = ot_pr_mn1
province_discount_money_df['平均'] = int(province_discount_money.mean())

#绘制柱形图
plt.figure(figsize=(22, 12))
bar_width = 0.25
index = np.arange(len(province_money_df))
#绘制实付金额的柱形图
plt.bar(index, province_money_df.values,
      bar_width, label='实付金额')
#已使用优惠券的实付金额的柱形图
plt.bar(index + bar_width, province_discount_money_df.values,
      bar_width, label='已使用优惠券的实付金额')
#未使用优惠券的实付金额的柱形图
plt.bar(index + 2 * bar_width, unused_province_discount_money_df.values,
      bar_width, label='未使用优惠券的实付金额')
plt.xlabel('省份', fontsize=20)
plt.ylabel('金额', fontsize=20)
plt.title('各省份实付金额及已使用/未使用优惠券的实付金额')
plt.xticks(index + 1.5 * bar_width, province_money_df.index)
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.legend()
#在柱形上添加数据更直观
for p, user_u, coupon_u, unused_coupon_u in zip(index, province_money_df.values,
                                              province_discount_money_df.values, 
                                              unused_province_discount_money_df.values):
  plt.text(p, user_u, str(user_u), ha='center', va='bottom')
  plt.text(p + bar_width, coupon_u, str(coupon_u), ha='center', va='bottom')
  plt.text(p + 2 * bar_width, unused_coupon_u, str(unused_coupon_u), ha='center', va='bottom')

plt.show()


# In[8]:


#分析购买高峰期折线图
  #各月份购买数量
plt.figure(figsize=(6,3))
plt.plot(month_money.index,month_money.values,marker='o')
plt.ylabel('购买数量')
plt.xlabel('月份')
plt.xticks(range(1,7))
for month_m, money_m in month_money.items():
    plt.text(month_m, money_m, str(money_m), ha='center', va='bottom')
plt.title('购买数量高峰月折线图')

  #各天数购买数量
plt.figure(figsize=(10,5))
plt.plot(day_money.index,day_money.values,marker='o')
plt.ylabel('购买数量')
plt.xlabel('天数')
plt.xticks(range(1,32))
for day_d, money_m in day_money.items():
    plt.text(day_d, money_m, str(money_m), ha='center', va='bottom')
plt.title('购买数量高峰日折线图')

  #各时刻购买数量
plt.figure(figsize=(8,4))
plt.plot(hour_money.index,hour_money.values,marker='o')
plt.ylabel('购买数量')
plt.xlabel('二十四小时时刻')
plt.xticks(range(0,24))
for hour_h, money_m in hour_money.items():
    plt.text(hour_h, money_m, str(money_m), ha='center', va='bottom')
plt.title('购买数量高峰时刻折线图')

plt.show()


# In[9]:


#分组分析占比饼状图
  #消费水平
group_user2=df.groupby('消费水平').size().sort_values(ascending=False)
plt.figure(figsize=(5,5))
plt.pie(group_user2,labels=['小于74低消费','74-123中低消费','124-189中高消费','大于189高消费'], autopct='%1.2f%%',startangle=50)
plt.legend(loc='upper right')
plt.title('消费水平占比图')

  #商品价位
group_shop2=df.groupby('商品分类').size().sort_values(ascending=False)
plt.figure(figsize=(5,5))
plt.pie(group_shop2,labels=['小于55低价商品','55-94中价商品','95-138中高价商品','大于138高价商品'], autopct='%1.2f%%',startangle=10)
plt.legend(loc='upper left')
plt.title('商品价位占比图')

plt.show()


# In[10]:


#其余分析
#优惠券使用情况占比
od_data=[discount_ordercount,discount_no_ordercount1,discount_no_ordercount2]
plt.figure(figsize=(5,5))
plt.pie(od_data,labels=['已使用优惠券的订单','领取未使用优惠券的订单','未领取优惠券的订单'], autopct='%1.2f%%',startangle=200)
plt.legend(loc='best')
plt.title('优惠券使用情况占比图')

#订单金额平均组成
order_mn_data=[df['邮费'].mean(),df['实付金额'].mean()]
plt.figure(figsize=(5,5))
plt.pie(order_mn_data,labels=['邮费','实付金额'], autopct='%1.2f%%',startangle=10)
plt.legend(loc='best')
plt.title('订单金额构成占比图')

#实付金额和购买数量的散点图
plt.figure(figsize=(10,6))
sns.scatterplot(x='购买数量', y='实付金额', data=df)
plt.title('购买数量 vs 实付金额')

plt.show()


# In[11]:


#有效特征
  #找到列表中出现频率最高的作为特征
def most_common(lst):
    return max(set(lst), key=lst.count)


# In[12]:


#用户有效特征展示
user_features=df.groupby('用户ID').agg({
    '购买数量':'sum',
    '实付金额':'sum',
    '省份':lambda x: most_common(list(x)),#推测用户购买最频繁IP的作为归属地
    '城市':lambda x: most_common(list(x)),
    '邮费':'sum',
    '消费水平':lambda x: most_common(list(x))#将订单消费水平出现最频繁的作为用户消费水平
    }).sort_values(by='实付金额',ascending=False)
display(user_features)


# In[13]:


#商家有效特征展示
shop_features=df.groupby('商家ID').agg({
    '购买数量':'sum',
    '实付金额':'sum',
    '商品分类':lambda x: most_common(list(x))#推测商家出现最频繁的作为该商家的主销商品
    }).sort_values(by='实付金额',ascending=False)
display(shop_features)


# In[14]:


#转换使用状态插入dataframe
def shift_discount(x):
    if x==1:
        return '已使用'
    elif x==0:
        return '已领取未使用'
    else:
        return '未领取'
shift_discount1=df['使用状态'].apply(shift_discount)
shift_discount1=pd.Series(shift_discount1,name='优惠券')
df['优惠券']=shift_discount1
#优惠券有效特征展示
discount_features=df.groupby('优惠券').agg({
    '购买数量':'sum',
    '实付金额':'sum'
    }).sort_values(by='实付金额',ascending=False)
display(discount_features)


# In[15]:


#计算RFM指标
    #最近一次购买时间
recent_buy=df.groupby('用户ID')['付款日期'].max()
    #购买频率
buy_frequency=df.groupby('用户ID').size()
    #购买金额
buy_money=df.groupby('用户ID')['实付金额'].sum()
#RFM指标合并为DataFrame
rfm_table=pd.DataFrame({'最近一次购买时间': recent_buy,'购买频率': buy_frequency,'购买金额': buy_money})


# In[16]:


#使用分位数进行分段
quantiles=rfm_table.quantile(q=[0.25, 0.5, 0.75])
#定义购买频率和购买金额的分数计算逻辑
def calculate_score(value, quantiles):
    if value<=quantiles[0.25]:
        return 4
    elif value<=quantiles[0.5]:
        return 3
    elif value<=quantiles[0.75]:
        return 2
    else:
        return 1

#将每个用户划分为不同的用户价值层次
def rfm_segment(row, recency, frequency, monetary):
    r_score=calculate_score(row['最近一次购买时间'],quantiles[recency])
    f_score=calculate_score(row['购买频率'],quantiles[frequency])
    m_score=calculate_score(row['购买金额'],quantiles[monetary])
    return f'{r_score}{f_score}{m_score}'

rfm_table['RFM分数'] = rfm_table.apply(rfm_segment, args=('最近一次购买时间','购买频率','购买金额'),axis=1)


# In[17]:


#计算CLV指标并写入RFM表
rfm_table['CLV指标']=rfm_table['购买频率']*rfm_table['购买金额']

#根据CLV指标定义用户价值
display(rfm_table['CLV指标'].describe())
def group_clv(x):
    if x>0 and x<=74:
        return '低期望'
    elif x>74 and x<=124:
        return '中低期望'
    elif x>124 and x<=196:
        return '中高期望'
    elif x>196 and x<=524:
        return '高期望'
    else:
        return '超高期望'
clv_group=rfm_table['CLV指标'].apply(group_clv)
clv_group=pd.Series(clv_group,name='用户总期望')
rfm_table['用户总期望']=clv_group

#将客户价值模型的结果与原始订单数据整合
merged_data = pd.merge(df, rfm_table, left_on='用户ID', right_index=True)
merged_data=merged_data.sort_values(by='订单ID')


# In[18]:


#绘制RFM分数分布直方图
plt.figure(figsize=(12, 6))
rfm_table['RFM分数'].value_counts().sort_index().plot(kind='bar',color='skyblue',edgecolor='black')
plt.xlabel('RFM分数')
plt.xticks(rotation=0)#将横坐标标签旋转角度设置为水平方向
plt.ylabel('用户数量')
plt.title('RFM分数分布')

#绘制各RFM和CLV的相关性热图
rfm_clv_corr = merged_data[['最近一次购买时间', '购买频率', '购买金额', 'CLV指标']].corr()
plt.figure(figsize=(5, 5))
sns.heatmap(rfm_clv_corr, annot=True, cmap='coolwarm', fmt='.2f', cbar_kws={'orientation': 'horizontal'})
plt.title('RFM和CLV的相关性热图')

plt.show()


# In[19]:


#各省份用户画像(上海,广东省,北京,江苏省,浙江省)
#只统计用户数量前五的省份，其余省份可用平均值概括

#定义提取各位数函数
  #提取百位数
def hundred(num):
    num_str = str(num)
    hundreds_digit = int(num_str[-3]) if len(num_str) > 2 else None
    return hundreds_digit
  #提取十位数
def decade(num):
    num_str = str(num)
    tens_digit = int(num_str[-2]) if len(num_str) > 1 else None
    return tens_digit
  #提取个位数
def unit(num):
    num_str = str(num)
    units_digit = int(num_str[-1]) if len(num_str) > 0 else None
    return units_digit

#自定义刻度位置和标签
custom_x_ticks = [1, 2, 3, 4]
custom_x_labels_R=['活跃','较活跃','较不活跃','不活跃']
custom_x_labels_F=['不粘合','较不粘合','较粘合','粘合']
custom_x_labels_M=['低价值','较低价值','较高价值','高价值']
custom_x_ticks_CLV=[0,1,2,3,4]
custom_x_labels_CLV=['低期望','中低期望','中高期望','高期望','超高期望']


# In[28]:


#上海市
shanghai_df = merged_data[merged_data['省份'] == '上海'].drop_duplicates(subset=[ '用户ID'])
shanghai_user = shanghai_df.groupby('RFM分数').size().reset_index(
    name='用户数量').sort_values(by='用户数量',ascending=False)
shanghai_clv=shanghai_df.groupby('用户总期望').size().reset_index(
    name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
shanghai_user['R'] = shanghai_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
shanghai_user['F'] = shanghai_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
shanghai_user['M'] = shanghai_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(shanghai_user['R'], shanghai_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(shanghai_user['F'], shanghai_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(shanghai_user['M'], shanghai_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(shanghai_clv['用户总期望'], shanghai_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('上海用户画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[21]:


#广东省
guangdong_df = merged_data[merged_data['省份'] == '广东省'].drop_duplicates(subset=[ '用户ID'])
guangdong_user = guangdong_df.groupby('RFM分数').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)
guangdong_clv=guangdong_df.groupby('用户总期望').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
guangdong_user['R'] = guangdong_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
guangdong_user['F'] = guangdong_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
guangdong_user['M'] = guangdong_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(guangdong_user['R'], guangdong_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(guangdong_user['F'], guangdong_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(guangdong_user['M'], guangdong_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(guangdong_clv['用户总期望'], guangdong_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('广东省用户画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[22]:


#北京
beijing_df = merged_data[merged_data['省份'] == '北京'].drop_duplicates(subset=[ '用户ID'])
beijing_user = beijing_df.groupby('RFM分数').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)
beijing_clv=beijing_df.groupby('用户总期望').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
beijing_user['R'] = beijing_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
beijing_user['F'] = beijing_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
beijing_user['M'] = beijing_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(beijing_user['R'], beijing_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(beijing_user['F'], beijing_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(beijing_user['M'], beijing_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(beijing_clv['用户总期望'], beijing_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('北京用户画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[23]:


#江苏省
jiangsu_df = merged_data[merged_data['省份'] == '江苏省'].drop_duplicates(subset=[ '用户ID'])
jiangsu_user = jiangsu_df.groupby('RFM分数').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)
jiangsu_clv=jiangsu_df.groupby('用户总期望').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
jiangsu_user['R'] = jiangsu_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
jiangsu_user['F'] = jiangsu_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
jiangsu_user['M'] = jiangsu_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(jiangsu_user['R'], jiangsu_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(jiangsu_user['F'], jiangsu_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(jiangsu_user['M'], jiangsu_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(jiangsu_clv['用户总期望'], jiangsu_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('江苏省用户画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[24]:


#浙江省
zhejiang_df = merged_data[merged_data['省份'] == '浙江省'].drop_duplicates(subset=[ '用户ID'])
zhejiang_user = zhejiang_df.groupby('RFM分数').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)
zhejiang_clv=zhejiang_df.groupby('用户总期望').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
zhejiang_user['R'] = zhejiang_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
zhejiang_user['F'] = zhejiang_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
zhejiang_user['M'] = zhejiang_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(zhejiang_user['R'], zhejiang_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(zhejiang_user['F'], zhejiang_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(zhejiang_user['M'], zhejiang_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(zhejiang_clv['用户总期望'], zhejiang_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('浙江省用户画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[25]:


#平均各省
pingjun_user = merged_data.groupby('RFM分数').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)
pingjun_clv=merged_data.groupby('用户总期望').size().reset_index(name='用户数量').sort_values(by='用户数量',ascending=False)

#提取R最近购买时间
pingjun_user['R'] = pingjun_user['RFM分数'].apply(lambda x: hundred(x))
#提取F购买频率
pingjun_user['F'] = pingjun_user['RFM分数'].apply(lambda x: decade(x))
#提取M购买金额
pingjun_user['M'] = pingjun_user['RFM分数'].apply(lambda x: unit(x))

# 创建柱状图
fig, axs = plt.subplots(1, 4, figsize=(15, 5))

#R分数的柱状图
axs[0].bar(pingjun_user['R'], pingjun_user['用户数量'], color='salmon', edgecolor='black')
axs[0].set_title('R分数分布')
axs[0].set_ylabel('用户数量')
axs[0].set_xticks(custom_x_ticks)
axs[0].set_xticklabels(custom_x_labels_R)

#F分数的柱状图
axs[1].bar(pingjun_user['F'], pingjun_user['用户数量'], color='lightgreen', edgecolor='black')
axs[1].set_title('F分数分布')
axs[1].set_ylabel('用户数量')
axs[1].set_xticks(custom_x_ticks)
axs[1].set_xticklabels(custom_x_labels_F)

#M分数的柱状图
axs[2].bar(pingjun_user['M'], pingjun_user['用户数量'], color='gold', edgecolor='black')
axs[2].set_title('M分数分布')
axs[2].set_ylabel('用户数量')
axs[2].set_xticks(custom_x_ticks)
axs[2].set_xticklabels(custom_x_labels_M)

#CLV指标的柱状图
axs[3].bar(pingjun_clv['用户总期望'], pingjun_clv['用户数量'], color='gold', edgecolor='black')
axs[3].set_title('CLV指标分布')
axs[3].set_ylabel('用户数量')
axs[3].set_xticks(custom_x_ticks_CLV)
axs[3].set_xticklabels(custom_x_labels_CLV)

plt.suptitle('用户总画像', fontsize=16)
plt.tight_layout()
plt.show()


# In[26]:


from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

#数据预处理
df['使用状态'].fillna(0, inplace=True)

# 将省份和城市进行独热编码
df = pd.get_dummies(df, columns=['省份', '城市'])
# 特征选择
features = ['实付金额', '购买数量'] + [col for col in df.columns if col.startswith('省份_') or col.startswith('城市_')]

# 划分数据集
X = df[features]
y = df['使用状态']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用调整过的超参数实例化RandomForestClassifier
model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
# 拟合模型
model.fit(X_train, y_train)

# 预测和评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
report = classification_report(y_test, y_pred, zero_division=1)

print(f'模型准确率: {accuracy}')
print('分类报告:')
print(report)
